package thread;

public class Demo6 {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            System.out.println("子线程ID：" + Thread.currentThread().getState());
        });
        thread.start();
        System.out.println("子线程启动后状态：" + thread.getState()+"是否存活："+thread.isAlive());
        thread.join();
        System.out.println("子线程执行完成后状态：" + thread.getState()+"是否存活："+thread.isAlive());
    }
}
//在Java中，Lambda/匿名内部类访问外部局部变量时，要求变量是 final （显式不可变）或“effectively final”（实际没有被修改）。而这里的 count 是一个会被修改的局部变量（线程中执行 count++ ），不符合语法要求，所以编译器会报错。这啥
// 这是Java的语法规则限制，背后是“局部变量的生命周期”问题~
// 简单理解：
// 局部变量（比如main里的 count ）是存在栈内存里的，方法执行完（main执行完）栈就会被销毁。而Lambda/匿名内部类（这里的线程逻辑）可能在方法结束后还在执行（线程是异步的），
//如果局部变量可以被修改，就会出现“变量已经被销毁，但代码还在访问/修改它”的矛盾。
// 所以Java强制要求：Lambda访问的局部变量必须是 final （不能改）或“实际没改”（effectively final），
//这样就能把变量的值“拷贝”到匿名类里，避免生命周期不一致的问题。
// 而你代码里的 count 是局部变量，还被线程里的 count++ 修改了，既不是 final 也不是实际不可变，
//所以编译器直接不让通过~
// 可是main结束了，线程在main里面，为啥不结束这个问题的关键是：线程的执行是“异步独立”的，
//不会随着main方法的结束而立即结束。
// main方法对应的是“主线程”，当你在main里调用 t1.start() 和 t2.start() 时，
//是启动了两个新的子线程——这两个子线程和主线程是“并行执行”的关系，主线程的代码（比如main方法）执行到末尾时，子线程可能还在运行中。
// // 如果不调用 join() 方法，主线程执行完就会直接结束，但整个程序会等待所有子线程执行完才会退出；
//而你代码里加了 t1.join() 和 t2.join() ，是让主线程“等待子线程执行完再继续”，所以main方法会等t1、t2执行完才会结束。
